/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Enlace;

/**
 *
 * @author Lau
 */
public class Trama {

    private String trama = new String();
    private String FlagS = "11111111111111111111"; //bandera inicio trama
    private String BitControl = new String();
    private String Datos = new String(); //Datos trama OK
    private String ControlErrorCRC = new String(); // campo para la detecion de errores

    public Trama() {
    }

    public Trama(String trama) {
        this.trama = trama;

    }
//----------Metodo que toma los datos y deja el campo de tamaño 6---------------
    public String ArmarDatos(String datos) // la cadena ya debe venir en binario
    {
        String auxiliardatos = new String();
        auxiliardatos = "";
        int j = 6 - datos.length();
        if (j > 0) {
            for (int i = 0; i < j; i++) {
                auxiliardatos += '0';
            }
        }
        auxiliardatos += datos;
        auxiliardatos += "000000000000";

        return auxiliardatos;
    }
//-Metodo que calcula el crc de los datos y el campo queda con tamaño de 17 bits
    public String ArmarCrc(int DatosEntradaCrc) {

        String auxiliarcrc = new String();
        String auxiliarceros = new String();
        auxiliarcrc = "";
        auxiliarceros = "";

        CRC crcinterno = new CRC();
        auxiliarcrc = crcinterno.crc(DatosEntradaCrc); // crc

        int j = 17 - auxiliarcrc.length();
        if (j > 0) {
            for (int i = 0; i < j; i++) {
                auxiliarceros += '0';
            }
        }
        auxiliarceros += auxiliarcrc;
        return auxiliarceros;
    }
//--------Metodo que arma la trama con los datos que necesita-------------------    
    public String AramarTrama(String dat, int datcrc, int Secuencia) {
        for (int i = 0; dat.length() < 6; i++) {
            dat = "0" + dat;
        }
        Datos = ArmarDatos(dat);
        ControlErrorCRC = ArmarCrc(datcrc);
        BitControl = "";
        //int auxDatos = Integer.parseInt(dat);
        int tamanoSecuencia = 0;
        String auxSecuencia = Integer.toBinaryString(Secuencia);

        tamanoSecuencia = 4 - auxSecuencia.length();
        for (int i = 0; i < tamanoSecuencia; i++) {
            BitControl += '0';
        }
        BitControl += auxSecuencia;
        trama = FlagS + BitControl + Datos + ControlErrorCRC + FlagS;
        return trama;
    }
//---------Metodo que desarma la trama y toma el campo de datos-----------------    
    public String DesarmarTramaDatos(String trama) {

        String datosTDesarmada = new String();
        datosTDesarmada = trama.substring(24, 30);
        System.out.println(datosTDesarmada);
        return datosTDesarmada;
    }
//---------Metodo que desarma la trama y toma el campo del crc------------------
    public String DesarmarTramaCRC(String trama) {

        String CRCTDesarmada = new String();
        CRCTDesarmada = trama.substring(42, 59);
        return CRCTDesarmada;
    }
//-----------Devuelve (True) si es carta o (False) si es estado-----------------
    public boolean CartaoEstado(String trama) {
        boolean CartaoEstado = false;
        String DatosTrama = new String();
        int DatosTDecimal;
        DatosTrama = DesarmarTramaDatos(trama);
        //Analizamos
        DatosTDecimal = Integer.parseInt(DatosTrama, 2);
        if (DatosTDecimal < 53 && DatosTDecimal > 0) {
            CartaoEstado = true;
        }
        return CartaoEstado;
    }
}
